package com.bjsxt;

import java.util.Stack;

/**Stack容器
 * Stack栈容器是Vector的一个子类，它实现了一个标准的后进先出（LIFO:Last In Fist Out）的栈
 *  * 特点：后进先出，它通过5个操作方法对Vector进行扩展，允许将向量视为堆栈
 *  栈永远都 是在顶部开始，由1 开始计算*/
/*操作栈的方法：
* boolean   empty()   测试栈是否空的  如果是空返回true
* E      peek()   看看这个堆栈的 顶部 的对象，没有从堆栈中删除它
* E     pop()    删除这个堆栈的 顶部 的对象，并返回该对象的值函数
* E     push(E item)  把一个项目到堆栈的顶部
* int   search(Object o)  返回基于位置的对象在这个堆栈   */
public class TestStack01 {
    public static void main(String[] args) {
        //实例化栈容器
        Stack<String> stack = new Stack<>();
        //String a = stack.push("ab");  //将元素添加到栈容器中
        //System.out.println(a);  //有返回值，返回的是添加的元素
        stack.push("a");
        stack.push("b");
        stack.push("c");

        System.out.println("--------查看顶部元素---------");
        //peek()与pop（）的区别在于有没删除顶部元素
        String str = stack.peek();
        System.out.println(str);

        System.out.println("------查找元素在栈中的位置-------");
        //栈是由顶部开始计算， 由1开始计数
        int num = stack.search("b");
        System.out.println(num);
        System.out.println(stack.search("c"));
        System.out.println("--------------");
        //获取栈中的元素  因为是后进先出，所以这里是c先出
        String pop = stack.pop();
        System.out.println(pop); //c
        String pop2 = stack.pop();
        System.out.println(pop2);//b

        System.out.println("------栈是否为空------");
        //如果为空则是true
        boolean flag = stack.empty();
        System.out.println(flag); //false
       // System.out.println(stack.empty());
        System.out.println("------------");
        //匹配符号对称性
        TestStack01 ts = new TestStack01();
        ts.symmetry1();


    }

    //符号对称性
    public void symmetry1(){
        String str5 = "...{....[....(...)....]....}..(....)..[..]...";
        Stack<String> stack1 = new Stack<>();
        //假设修正法  利用后进先出
        boolean flag8 = true;//假设是匹配的
        //拆分字符串，获取字符
        for(int i =0;i<str5.length();i++){
            char c = str5.charAt(i);
            //当得到的是左括号时，直接将右括号推到顶部
            if(c == '{'){
                stack1.push("}");
            }
            if(c == '['){
                stack1.push("]");
            }
            if(c =='('){
                stack1.push(")");
            }
            //判断是否匹配
            //当得到是右括号时，
            if(c =='}' || c==']'||c==')'){
                //如果stack是空，退出
                if(stack1.empty()){
                    flag8=false;
                    break;
                }
                //拆开每一个字符
                String x = stack1.pop(); //取出符号到顶部
                if(x.charAt(0) != c){
                    flag8 = false;
                    break;
                }
            }
        }
        //当匹配完，还有一个符号多出来
        //...{....[....(...)....]....}..(....)..[..]...{..
        if(!stack1.empty()){
            flag8=false;
        }
        System.out.println(flag8);
    }
}
